home *** CD-ROM | disk | FTP | other *** search
- * The LAME API is frozen. Poorly designed as it is, don't change it,
- and add to it sparingly.
-
- * Don't take it upon yourself to go through LAME with the sole purpose
- of updating everything to match this guide. Especially important:
- don't change the spacing, indentation, curly braces, etc,
- in routines you did not write.
-
- * If you want to make a change which effects many many functions,
- please check with the maintainer first.
-
- * Respect the indentation of the author of the original function.
- If the indentation is not consistent, use 4.
-
- * Don't use tabulators (the character with the value '\t') in source code,
- especially these with a width of unequal 8. Lame sources are using
- different sizes for tabulators.
-
- * Don't set the macro NDEBUG in alpha versons.
- NDEBUG should be set for beta versions.
-
- * check important assumptions with an assert()
-
- * use int for all integer quantities.
- LAME requires 32 bit ints, so you can assume int is at least 32 bits.
- Don't use 'long'. Don't use 'unsigned' unless ABSOLUTELY necessary.
- Don't use 'char' just to save bytes. If 64 bits is required, use int64.
-
- Annnotation:
- ISO C calls the 64 bit int type not int64 but int64_t.
-
- * Avoid using float or double, and instead use: (defined in machine.h).
-
- FLOAT for variables which require at least 32bits
- FLOAT8 for variables which require at least 64bits
-
- On some machines, 64bit will be faster than 32bit. Also, some math
- routines require 64bit float, so setting FLOAT=float will result in a
- lot of conversions.
-
- Annotation (pfk):
- The new ISO C standard passed in autumn 1999 has defined new types for
- exactly this reason. There are called float_least32_t and float_least64_t
- and have at least the advantage that you not need to explain their
- meaning.
-
- Annotation (mt):
- we will adopt this convention in Jan 1, 2003.
-
-
- * The internal representation of PCM samples in type 'sample_t',
- currently this is a FLOAT.
-
- * Use SI base units. Lame mixes Hz, kHz, kbps, bps. This is mess.
-
- Example:
- float wavelength_green = 555.e-9;
- unsigned data_rate = 128000;
- float lowpass_freq = 12500.;
-
- Converting between user input and internal representation should be done
- near the user interface, not in the most inner loop of an utility
- function.
-
- ----------------------------------------------------------------------------------
- Edited version of the Linux Kernel Style Guide:
- ----------------------------------------------------------------------------------
-
- Chapter 1: Indentation
-
- Respect the indentation of the author of the original function.
- If the indentation is not consistent, don't change it. If
- you are so anal-retentive about these things and you can't
- bare to even look at code with poor indentation, change it to 4.
-
-
- Chapter 2: Placing Braces
-
- The other issue that always comes up in C styling is the placement of
- braces. Unlike the indent size, there are few technical reasons to
- choose one placement strategy over the other, but the preferred way, as
- shown to us by the prophets Kernighan and Ritchie, is to put the opening
- brace last on the line, and put the closing brace first, thusly:
-
- if (x is true) {
- we do y
- }
-
- However, there is one special case, namely functions: they have the
- opening brace at the beginning of the next line, thus:
-
- int function(int x)
- {
- body of function
- }
-
- Heretic people all over the world have claimed that this inconsistency
- is ... well ... inconsistent, but all right-thinking people know that
- (a) K&R are _right_ and (b) K&R are right. Besides, functions are
- special anyway (you can't nest them in C).
-
- Note that the closing brace is empty on a line of its own, _except_ in
- the cases where it is followed by a continuation of the same statement,
- ie a "while" in a do-statement or an "else" in an if-statement, like
- this:
-
- do {
- body of do-loop
- } while (condition);
-
- and
-
- if (x == y) {
- ..
- } else if (x > y) {
- ...
- } else {
- ....
- }
-
- Rationale: K&R.
-
- Also, note that this brace-placement also minimizes the number of empty
- (or almost empty) lines, without any loss of readability. Thus, as the
- supply of new-lines on your screen is not a renewable resource (think
- 25-line terminal screens here), you have more empty lines to put
- comments on.
-
-
- Chapter 3: Naming
-
- C is a Spartan language, and so should your naming be. Unlike Modula-2
- and Pascal programmers, C programmers do not use cute names like
- ThisVariableIsATemporaryCounter. A C programmer would call that
- variable "tmp", which is much easier to write, and not the least more
- difficult to understand.
-
- HOWEVER, while mixed-case names are frowned upon, descriptive names for
- global variables are a must. To call a global function "foo" is a
- shooting offense.
-
- GLOBAL variables (to be used only if you _really_ need them) need to
- have descriptive names, as do global functions. If you have a function
- that counts the number of active users, you should call that
- "count_active_users()" or similar, you should _not_ call it "cntusr()".
-
- Encoding the type of a function into the name (so-called Hungarian
- notation) is brain damaged - the compiler knows the types anyway and can
- check those, and it only confuses the programmer. No wonder MicroSoft
- makes buggy programs.
-
- LOCAL variable names should be short, and to the point. If you have
- some random integer loop counter, it should probably be called "i".
- Calling it "loop_counter" is non-productive, if there is no chance of it
- being mis-understood. Similarly, "tmp" can be just about any type of
- variable that is used to hold a temporary value.
-
-
-
- Chapter 4: Functions
-
- Document functions.
-
- Keep functions as modular as possible. But don't adhere to artificial
- line number limitations. For example, lame_encode_frame() encodes a
- single MP3 frame and is a long sequence of function calls. It makes
- no sense to break this into two or more routines.
-
-
-
- Chapter 5: Commenting
-
- Comments are good, but there is also a danger of over-commenting. NEVER
- try to explain HOW your code works in a comment: it's much better to
- write the code so that the _working_ is obvious, and it's a waste of
- time to explain badly written code.
-
- Generally, you want your comments to tell WHAT your code does, not HOW.
- Also, try to avoid putting comments inside a function body: if the
- function is so complex that you need to separately comment parts of it,
- you should probably go back to chapter 4 for a while. You can make
- small comments to note or warn about something particularly clever (or
- ugly), but try to avoid excess. Instead, put the comments at the head
- of the function, telling people what it does, and possibly WHY it does
- it.
-
-
-